package br.com.virtual.replicar.model;
 
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import br.com.virtual.base.enums.TipoPessoaEnum;

@Entity
@Table(name = "pessoa")
@Inheritance(strategy = InheritanceType.JOINED)
public class PessoaSinc extends VirtualModelReplicacao {

	private static final long serialVersionUID = 1L;

	@Id
	private Long id;
	
	private String nome;
	
	@Column(unique = true, nullable = false)
	private String email;
	
	private String telefone1;
	
	private String telefone2;
	
	private boolean newsLetter;
	
	private boolean ativo = true;
	
	@Enumerated(EnumType.ORDINAL)
	private TipoPessoaEnum tipoPessoa = TipoPessoaEnum.FISICA;

	@OneToOne(cascade = CascadeType.REFRESH)
	private UsuarioSinc usuario;

	@OneToMany(mappedBy = "pessoa", cascade = CascadeType.REFRESH)
	private List<EnderecoSinc> enderecos;

	@OneToOne(cascade = CascadeType.REFRESH)
	private InteresseSinc interesse;

	/*
	 * Getters and Setters
	 */

	public PessoaSinc() {
		
	}

		
	public PessoaSinc(Long idEntidade) {
		setId(idEntidade);
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getTelefone1() {
		return telefone1;
	}

	public void setTelefone1(String telefone1) {
		this.telefone1 = telefone1;
	}

	public String getTelefone2() {
		return telefone2;
	}

	public void setTelefone2(String telefone2) {
		this.telefone2 = telefone2;
	}

	public boolean isNewsLetter() {
		return newsLetter;
	}

	public void setNewsLetter(boolean newsLetter) {
		this.newsLetter = newsLetter;
	}

	public boolean isAtivo() {
		return ativo;
	}

	public void setAtivo(boolean ativo) {
		this.ativo = ativo;
	}

	public UsuarioSinc getUsuario() {
		if (usuario == null) {
			usuario = new UsuarioSinc();
		}
		return usuario;
	}

	public void setUsuario(UsuarioSinc usuario) {
		this.usuario = usuario;
	}

	public List<EnderecoSinc> getEnderecos() {
		return enderecos;
	}

	public void setEnderecos(List<EnderecoSinc> enderecos) {
		this.enderecos = enderecos;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public TipoPessoaEnum getTipoPessoa() {
		return tipoPessoa;
	}

	public void setTipoPessoa(TipoPessoaEnum tipoPessoa) {
		this.tipoPessoa = tipoPessoa;
	}

	// public Venda getCarrinho() {
	// return carrinho;
	// }
	//
	// public void setCarrinho(Venda carrinho) {
	// this.carrinho = carrinho;
	// }

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((enderecos == null) ? 0 : enderecos.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		PessoaSinc other = (PessoaSinc) obj;
		if (enderecos == null) {
			if (other.enderecos != null)
				return false;
		} else if (!enderecos.equals(other.enderecos))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Pessoa [id=" + id + ", nome=" + nome + ", email=" + email
				+ ", telefone1=" + telefone1 + ", telefone2=" + telefone2
				+ ", newsLetter=" + newsLetter + ", ativo=" + ativo
				+ ", usuario=" + usuario + ", endereco=" + enderecos + "]";
	}

	public InteresseSinc getInteresse() {

		if (this.interesse == null) {
			this.interesse = new InteresseSinc();
			this.interesse.setCliente(this);
		}
		return interesse;
	}

	public void setInteresse(InteresseSinc interesse) {
		this.interesse = interesse;
	}

}